package mine.code.question.动态规划;

import org.junit.Test;

/**
 * @author caijinnan
 * @date 2020/5/22 17:12
 * 给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数，随后玩家2继续从剩余数组任意一端拿取分数，
 * 然后玩家1拿，……。每次一个玩家只能拿取一个分数，分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。
 *
 * 给定一个表示分数的数组，预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。
 *
 */
public class 预测赢家 {
    @Test
    public void run(){
        int[] nums = {0};
        System.out.println(PredictTheWinner(nums));
    }


    //dp[i][j] = max(nums[i] - dp(i+1, j), nums[j] - dp(i, j-1))
    public boolean PredictTheWinner(int[] nums) {
        int length = nums.length;
        if(length>>2<<2==length){
            return true;
        }
        int[][] dp = new int[length][length];
        for (int i = length-1; i >=0; i--) {
            for (int j = i; j <length ; j++) {
                if(i==j){
                    dp[i][j] = nums[i];
                }else{
                    dp[i][j] = Math.max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1]);
                }
            }
        }
        return dp[0][length-1]>=0;
    }
}